package com.cskaoyan.javase.array._5variable;

/**
 * 可变参数的使用,Java1.5当中引入的新特性
 * 当希望调用方法时,能够直接传入不确定个数的实际参数,就需要使用可变参数
 * 可变参数的语法:
 *       [修饰符列表] 返回值类型 方法名 (形式参数列表,数据类型... 变量名){
 *  *          // 方法体
 *       }
 * 其中: "数据类型..."表示某个数据类型的可变参数
 *
 * 可变参数的本质: 就是一个对应数据类型的数组
 *
 * 可变参数的原理:
 *      编译器会自动将不确定个数的实参自动封装成一个对应类型的数组,然后传入方法
 *      不用可变参数,直接使用数组形参时,这个数组是程序员自己创建的
 *      而使用可变参数之后,这个数组是JVM帮助我们创建的
 *
 *      像这种实现原理不点,但是底层多做事,程序员少做事的语法设计,称之为"语法糖"
 *      "语法糖"可以方便程序员写代码.
 *
 *
 * @since 15:30
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        // int[] arr = {1, 2, 3, 4, 5, 6};
        // System.out.println(sum(arr));
        // sum(1, 2, 3, 4);

        // 可变参数的使用效果
        System.out.println(sum(1, 2));
        System.out.println(sum(1, 2, 3));
        System.out.println(sum(1, 2, 3, 4));
        System.out.println(sum(1, 2, 3, 4, 5));


    }


    // 需求: 求不确定个数int类型数据之和
    // 既然参数有多个,就需要传入一个容器,比如数组
    /*public static int sum(int[] arr) {
        int sumValue = 0;
        for (int ele : arr) {
            sumValue += ele;
        }
        return sumValue;
    }*/

    /*
        以上实现,要求方法传入一个数组
        虽然能够达成功能
        但不符合我的需求
        我希望:
            能够在调用方法时,就可以随便传入不同个数的int参数
            从而求不确定个数的int类型数据之和

            以上需求需要使用可变参数
     */
    // 'sum(int...)' is already defined in 'com.cskaoyan.javase.array._5variable.Demo'
    public static int sum(int... arr) {
        int sumValue = 0;
        for (int ele : arr) {
            sumValue += ele;
        }
        return sumValue;
    }

}
